﻿using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Text.RegularExpressions;
using DevExpress.XtraEditors;
using DevExpress.XtraSplashScreen;
using DevExpress.XtraGrid;
using DevExpress.XtraReports.UI;
using prjKQXS_UI.View;
using prjKQXS_Report.Hop_dong;
using prjKQXS_DLL;
using prjKQXS_DLL.Danh_muc;
using prjKQXS_DLL.Hop_dong;

namespace prjKQXS_UI.Hop_dong
{
    public partial class frmDMHopDong : XtraForm
    {
        clsHopDong hd = new clsHopDong();
        Color defaultColor; //biến này để lưu lại gvHopDong.Appearance.FocusedRow.BackColor

        public int id = 0;
        public object path = "";

        /// <summary>
        /// Biến này tự động được gán khi chọn đơn vị ở lueDonVi.
        /// Giá trị là '%' nếu cọn "Tất cả", hoặc là mã đơn vị tương ứng với dòng đã chọn.
        /// </summary>
        char MaDV;

        /// <summary>
        /// Biến này tự động được gán khi chọn đơn vị ở lueDonVi.
        /// Giá trị là "Công ty" nếu cọn "Tất cả", hoặc là tên đơn vị tương ứng với dòng đã chọn.
        /// </summary>
        string TenDV;

        /// <summary>
        /// Biến này tự động được gán là -1 (nếu chọn tất cả cán bộ) hoặc là id của cán bộ tương ứng khi chọn từ lueCanBo.
        /// </summary>
        int DMCanBoID;

        /// <summary>
        /// Biến này tự động được gán là "(Tất cả)" (nếu chọn tất cả cán bộ) hoặc là tên cán bộ tương ứng khi chọn từ lueCanBo.
        /// </summary>
        string TenCB;

        #region form EVENT =======================================================================
        public frmDMHopDong()
        {
            InitializeComponent();
            
            ucDonVi1.lueDonVi.EditValueChanged += new EventHandler(lueDonVi_EditValueChanged);
            ucCanBo1.lueCanBo.EditValueChanged += new EventHandler(lueCanBo_EditValueChanged);

            hd.OnAction += new clsHopDong.OnActionHandler(cls_OnAction);
            hd.OnError += new clsHopDong.OnErrorHandler(cls_OnError);
            loadPhanQuyen();
        }
        private  void loadPhanQuyen()
        {
            if (BienTc.isThanhPho || BienTc.isQuanHuyen || !clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.B_InHopDong))
                sbtnIn.Enabled = false;
            else sbtnIn.Enabled = true;

            if (BienTc.isThanhPho || BienTc.isQuanHuyen || !clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.B_ThanhLyHopDong))
                sbtnTLyHD.Enabled = false;
            else sbtnTLyHD.Enabled = true;

            if (BienTc.isThanhPho || BienTc.isQuanHuyen || !clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.B_ChuyenDaiLy))
                sbtnChuyenDL.Enabled = false;
            else sbtnChuyenDL.Enabled = true;
            if (BienTc.isThanhPho || BienTc.isQuanHuyen || !clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.B_sbtnInHDThang))
            {
                //sbtnInHDThang.Enabled = false;
            }
            else
            {
                sbtnInHDThang.Enabled = true;
            }
        }

        private void frmDMHopDong_Load(object sender, EventArgs e)
        {
            defaultColor = gvHopDong.Appearance.FocusedRow.BackColor;

            #region load rilue
            DataTable dt1 = new DataTable();
            DataTable dt3 = new DataTable();

            clsHopDong.load_rilue(ref dt1, ref dt3);

            lueTinhTrang.DataSource = dt1;
            lueLoaiHD.DataSource = dt3;
            #endregion

            //if (!BienTc.isMayChu())  //Nếu không phải là máy chủ
            //{
            //    sbtnChuyenDL.Enabled = false;
            //}
            //else
            //{
            //    sbtnChuyenDL.Enabled = true;
            //}

            load_lueDonVi();ucDonVi1.lueDonVi.ItemIndex = 0;
            deThang.DateTime = DateTime.Now;
        }

        private void frmDMHopDong_Shown(object sender, EventArgs e)
        {
            cbtnSua.Enabled = clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.B_SuaDMHopDong);
        }

        private void frmDMHopDong_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (frmMain.sEdittingFormName.Contains(this.Name))
            {
                string msg = "Bạn đang thực hiện thêm mới hoặc chỉnh sửa hợp đồng nhưng dữ liệu chưa được lưu.\n" +
                    "Bạn vẫn muốn thoát khỏi danh mục hợp đồng?";
                if (MessageBox.Show(msg, "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No)
                {
                    e.Cancel = true;
                }
                else
                {
                    gvHopDong.CancelUpdateCurrentRow();
                    frmMain.sEdittingFormName = frmMain.sEdittingFormName.Replace(this.Name, "");
                    this.Close();
                }
            }
        }
        #endregion ================================================================================


        #region Buttons ===========================================================================
        private void cbtnSua_CheckedChanged(object sender, EventArgs e)
        {
            if (cbtnSua.Checked)cbtnSua.Text = "Khóa";
            else
            {
                chkKhoiPhuc.Checked = false;
                cbtnSua.Text = "Sửa";
                loadData();
            }

            if (gvHopDong.GetDataRow(GridControl.NewItemRowHandle) != null) //Nếu có dòng đang thêm mới trong gvDonVi
                loadData();

            sbtnThem.Enabled = cbtnSua.Checked;
            sbtnXoa.Enabled = cbtnSua.Checked;
            gvHopDong_DataSourceChanged(sender, e);
            chkKhoiPhuc.Enabled = cbtnSua.Checked;
            gvHopDong.OptionsBehavior.Editable = cbtnSua.Checked;

            if (BienTc.isQuanHuyen == true || BienTc.isThanhPho == true || !clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.C_MaDL))
            {
                gcolMaDL.OptionsColumn.AllowEdit = false;
                gcolMaDL.AppearanceHeader.ForeColor = Color.Gray;
            }

            if (BienTc.isQuanHuyen == true || BienTc.isThanhPho == true || !clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.C_TenDL))
            {
                gcolTenDL.OptionsColumn.AllowEdit = false;
                gcolTenDL.AppearanceHeader.ForeColor = Color.Gray;
            }
        }

        private void sbtnThem_Click(object sender, EventArgs e)
        {
            if (BienTc.isThanhPho == true || BienTc.isQuanHuyen == true || !clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.B_ThemHopDong))
                clsCommon.MsgBox("Bạn không được phép thêm mới Hợp đồng ở đơn vị", 1);
            else
            {
                if (MaDV == '%')
                {
                    clsCommon.MsgBox("Phải chọn đơn vị trước khi thêm mới!", 0);
                    ucDonVi1.lueDonVi.Focus();
                }
                else if (DMCanBoID==-1)
                {
                    clsCommon.MsgBox("Phải chọn cán bộ trước khi thêm mới!", 0);
                    ucCanBo1.lueCanBo.Focus();
                }
                else
                {
                    enableControlForAddNew(false);
                    gvHopDong.AddNewRow();

                    gvHopDong.SetFocusedRowCellValue("Ma_DT", hd.generateMaHD(MaDV));

                    string macb = ucCanBo1.lueCanBo.GetColumnValue("Ma_DT").ToString().Trim();
                    gvHopDong.SetFocusedRowCellValue("Ma_DaiLy", hd.generateMaDL(macb));
                    gvHopDong.SetFocusedRowCellValue("DMCanBoID", DMCanBoID);

                    gvHopDong.FocusedColumn = gcolMaHD;
                    gvHopDong.ShowEditor();
                }
            }
        }

        private void sbtnXoa_Click(object sender, EventArgs e)
        {
            if (chkKhoiPhuc.Checked)
            {
                if (gcHopDong.DataSource != null && ((DataTable)gcHopDong.DataSource).Rows.Count > 0)
                {
                    string msg = "Ở chế độ khôi phục hợp đồng và thông tin doanh thu liên quan sẽ bị xóa hoàn toàn khỏi hệ thống.\nBạn có chắc chắn xóa hợp đồng này?";
                    if (clsCommon.MsgBox(msg, 2) == System.Windows.Forms.DialogResult.Yes)
                        hd.Delete((int)gvHopDong.GetFocusedDataRow()["ID"], false);
                }
            }
            else
            {
                if (gcHopDong.DataSource != null && ((DataTable)gcHopDong.DataSource).Rows.Count > 0)
                {
                    if (clsCommon.MsgBox("Bạn có chắc chắn muốn xóa hợp đồng này?", 2) == System.Windows.Forms.DialogResult.Yes)
                        hd.Delete((int)gvHopDong.GetFocusedDataRow()["ID"], true);
                }
            }
            loadData();
        }

        private void sbtnLoc_Click(object sender, EventArgs e)
        {
            if (sbtnLoc.Tag.Equals("LOC"))
            {
                sbtnLoc.Tag = "BL";
                sbtnLoc.Text = "&Bỏ lọc";
                gvHopDong.OptionsView.ShowAutoFilterRow = true;
            }
            else
            {
                gvHopDong.OptionsView.ShowAutoFilterRow = false;
                sbtnLoc.Tag = "LOC";
                sbtnLoc.Text = "&Lọc";
                loadData();
                gvHopDong.ClearColumnsFilter();
            }

            lblSoLuong.Text = gvHopDong.RowCount.ToString();
        }

        private void sbtnIn_Click(object sender, EventArgs e)
        {
            object MaLoaiHD = clsCommon.getCellValue("HOPDONG", "Ma_DMLoaiHD", "Where ID=" + gvHopDong.GetFocusedDataRow()["ID"].ToString());
            if (MaLoaiHD != null && MaLoaiHD.ToString() != "")
            {
                id = (int)clsCommon.Parse(gvHopDong.GetFocusedDataRow()["ID"].ToString(), 0);
                path = clsCommon.getCellValue("DMLOAIHOPDONG", "URL", "Where Ma_DT='" + MaLoaiHD.ToString() + "'");
                if (path == null || path.ToString() == "")
                {
                    if (clsCommon.MsgBox("Hợp đồng này chưa được chọn file báo cáo .\nBạn có muốn chọn ngay bây giờ", 2) == DialogResult.Yes)
                    {
                        if (openFileDialog1.ShowDialog() == DialogResult.OK)
                        {
                            id = (int)clsCommon.Parse(gvHopDong.GetFocusedDataRow()["ID"].ToString(), 0);
                            path = openFileDialog1.FileName;
                            clsCommon.updateRowValue("DMLOAIHOPDONG", "URL", "Where Ma_DT='" + gvHopDong.GetFocusedDataRow()["Ma_DMLoaiHD"].ToString() + "'", openFileDialog1.FileName);
                            frmBaoCao frm = new frmBaoCao(this);
                            frm.ShowDialog();
                        }
                    }
                }
                else
                {
                    frmBaoCao frm = new frmBaoCao(this);
                    frm.ShowDialog();
                }
            }
            else
            {
                if (clsCommon.MsgBox("Bạn chưa chọn loại hợp đồng ", 2) == DialogResult.Yes)
                {
                    id = (int)clsCommon.Parse(gvHopDong.GetFocusedDataRow()["ID"].ToString(), 0);
                    frmDSLoaiHopDong frm = new frmDSLoaiHopDong(this);
                    frm.ShowDialog();
                    loadData();
                }
            }
        }

        private void sbtnInHDThang_Click(object sender, EventArgs e)
        {
            SplashScreenManager.ShowForm(typeof(frmWaitForm));
            {
                rptInHDThang rpt = new rptInHDThang();
                rpt.OnLoadComplete += new rptInHDThang.OnLoadCompleteHandler(rpt_OnLoadComplete);
                rpt.Parameters["pMaDV"].Value = MaDV;
                rpt.Parameters["pTenDV"].Value = MaDV == '%' ? "Công ty" : TenDV;
                rpt.Parameters["pDMCanBoID"].Value = DMCanBoID;
                rpt.Parameters["pTenCB"].Value = TenCB;
                rpt.Parameters["pNgay"].Value = deThang.DateTime;
                rpt.ShowRibbonPreview();
            }
        }

        private void btnDong_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void sbtnKhoiPhuc_Click(object sender, EventArgs e)
        {
            string s = "Bạn có chắc chắn muốn khôi phục hợp đồng này?";
            if (XtraMessageBox.Show(s, "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == System.Windows.Forms.DialogResult.Yes)
            {
                hd.Restore((int)gvHopDong.GetFocusedDataRow()["ID"]);
                loadData();
            }
        }

        private void chkKhoiPhuc_CheckedChanged(object sender, EventArgs e)
        {
            if (chkKhoiPhuc.Checked) gvHopDong.OptionsBehavior.Editable = false;
            else gvHopDong.OptionsBehavior.Editable = cbtnSua.Checked;

            loadData();
        }

        private void sbtnTLyHD_Click(object sender, EventArgs e)
        {
            bool isthanhly = false;
            DateTime NgayTL =(DateTime)clsCommon.Parse(gvHopDong.GetFocusedDataRow()["Ngay_ThanhLy"].ToString(),4);
            if (gvHopDong.GetFocusedDataRow()["Thanh_Ly"].ToString().ToUpper() == "FALSE")
            {//thêm isthanhly
                isthanhly = false;
                string number = gvHopDong.GetFocusedDataRow()["ID"].ToString();
                string mahd = gvHopDong.GetFocusedDataRow()["Ma_DT"].ToString();
                string tendl = gvHopDong.GetFocusedDataRow()["Ma_DaiLy"].ToString() + 
                    " - " + gvHopDong.GetFocusedDataRow()["Ten_DaiLy"].ToString();
                frmThanhLy frm = new frmThanhLy((int)clsCommon.Parse(number, 0), mahd, tendl,isthanhly,NgayTL);
                frm.ShowDialog();
                loadData();
            }
            
            else
            {
                 if (clsCommon.MsgBox("Hợp đồng này đã thanh lý!, Bạn muốn in lại?", 2) == System.Windows.Forms.DialogResult.Yes)
                {
                    isthanhly = true;
                    frmThanhLy frm = new frmThanhLy((int)clsCommon.Parse(gvHopDong.GetFocusedDataRow()["ID"].ToString(), 0), 
                        gvHopDong.GetFocusedDataRow()["Ma_DT"].ToString(), gvHopDong.GetFocusedDataRow()["Ma_DaiLy"].ToString() + 
                        " - " + gvHopDong.GetFocusedDataRow()["Ten_DaiLy"].ToString(),isthanhly,NgayTL);
                    frm.ShowDialog();
                    loadData();
                }
            }
        }

        private void rgThanhly_SelectedIndexChanged(object sender, EventArgs e)
        {
            loadData();
        }

        private void sbtnChuyenDL_Click(object sender, EventArgs e)
        {
            // Máy đơn vị chuyển đại lý
            if (gvHopDong.RowCount > 0)
            {
                string madl = gvHopDong.GetFocusedDataRow()["Ma_DaiLy"].ToString().Trim();
                string tendl = gvHopDong.GetFocusedDataRow()["Ten_DaiLy"].ToString().Trim();
                int idHD = (int)gvHopDong.GetFocusedDataRow()["ID"];
                string DMCanBoID = gvHopDong.GetFocusedDataRow()["DMCanBoID"].ToString();

                frmChuyen frm = new frmChuyen(madl, tendl, DMCanBoID, idHD);
                frm.ShowDialog();
                loadData();
            }

            if (BienTc.isThanhPho == true || BienTc.isQuanHuyen == true)
            {
                SqlConnection connS = new SqlConnection(clsCommon.getServerConnectionString());
                SqlConnection connN = new SqlConnection(BienTc.connString);
                SqlCommand cmd = null;

                // cap nhat luon
                SqlDataAdapter da = new SqlDataAdapter("Select * from NhatKyChuyenDL", connS);
                DataTable dtNK = new DataTable();
                da.Fill(dtNK);
                foreach (DataRow row in dtNK.Rows)
                {
                    SqlDataAdapter dankC = new SqlDataAdapter("Select * from NhatKyChuyenDL where ID_Update=@idupdate", connN);
                    dankC.SelectCommand.Parameters.AddWithValue("@idupdate", row["ID_Update"]);
                    DataTable dtnkc = new DataTable();
                    dankC.Fill(dtnkc);
                    if (dtnkc.Rows.Count <= 0)
                    {
                        // insert nhat ky chuyen dai ly
                        if (connN.State == ConnectionState.Closed)
                        {
                            connN.Open();
                        }
                        SqlCommand cmdNK = new SqlCommand(@"Insert into NhatKyChuyenDL(Ngay_Chuyen,Ma_DLCu,Ma_DLMoi,Ten_DL,Ma_CBCu,Ma_CBMoi,ID_Update,Ngay_HD) values(
                                                                    @Ngay_Chuyen,@Ma_DLCu,@Ma_DLMoi,@Ten_DL,@Ma_CBCu,@Ma_CBMoi,@ID_Update,@Ngay_HD)", connN);
                        cmdNK.Parameters.AddWithValue("@Ngay_Chuyen", row["Ngay_Chuyen"]);
                        cmdNK.Parameters.AddWithValue("@Ma_DLCu", row["Ma_DLCu"]);
                        cmdNK.Parameters.AddWithValue("@Ma_DLMoi", row["Ma_DLMoi"]);
                        cmdNK.Parameters.AddWithValue("@Ten_DL", row["Ten_DL"]);
                        cmdNK.Parameters.AddWithValue("@Ma_CBCu", row["Ma_CBCu"]);
                        cmdNK.Parameters.AddWithValue("@Ma_CBMoi", row["Ma_CBMoi"]);
                        cmdNK.Parameters.AddWithValue("@ID_Update", row["ID_Update"]);
                        cmdNK.Parameters.AddWithValue("@Ngay_HD", row["Ngay_HD"]);
                        cmdNK.ExecuteNonQuery();
                    }
                }

                //Dong toi chuyen len luon
                da = new SqlDataAdapter("Select * from NhatKyChuyenDL", connN);
                dtNK = new DataTable();
                da.Fill(dtNK);
                foreach (DataRow row in dtNK.Rows)
                {
                    SqlDataAdapter dankC = new SqlDataAdapter("Select * from NhatKyChuyenDL where ID_Update=@idupdate", connS);
                    dankC.SelectCommand.Parameters.AddWithValue("@idupdate", row["ID_Update"]);
                    DataTable dtnkc = new DataTable();
                    dankC.Fill(dtnkc);
                    if (dtnkc.Rows.Count <= 0)
                    {
                        // insert nhat ky chuyen dai ly
                        if (connS.State == ConnectionState.Closed)
                        {
                            connS.Open();
                        }
                        SqlCommand cmdNK = new SqlCommand(@"Insert into NhatKyChuyenDL(Ngay_Chuyen,Ma_DLCu,Ma_DLMoi,Ten_DL,Ma_CBCu,Ma_CBMoi,ID_Update,Ngay_HD) values(
                                                                    @Ngay_Chuyen,@Ma_DLCu,@Ma_DLMoi,@Ten_DL,@Ma_CBCu,@Ma_CBMoi,@ID_Update,@Ngay_HD)", connS);
                        cmdNK.Parameters.AddWithValue("@Ngay_Chuyen", row["Ngay_Chuyen"]);
                        cmdNK.Parameters.AddWithValue("@Ma_DLCu", row["Ma_DLCu"]);
                        cmdNK.Parameters.AddWithValue("@Ma_DLMoi", row["Ma_DLMoi"]);
                        cmdNK.Parameters.AddWithValue("@Ten_DL", row["Ten_DL"]);
                        cmdNK.Parameters.AddWithValue("@Ma_CBCu", row["Ma_CBCu"]);
                        cmdNK.Parameters.AddWithValue("@Ma_CBMoi", row["Ma_CBMoi"]);
                        cmdNK.Parameters.AddWithValue("@ID_Update", row["ID_Update"]);
                        cmdNK.Parameters.AddWithValue("@Ngay_HD", row["Ngay_HD"]);
                        cmdNK.ExecuteNonQuery();
                    }
                }

                // Máy đơn vị chuyển đại lý sẽ chuyển lên cty luôn

                if (BienTc.isThanhPho == true || BienTc.isQuanHuyen == true)
                {
                    SqlDataAdapter dad = new SqlDataAdapter("Select * from DONVI", connN);
                    DataTable dtd = new DataTable();
                    dad.Fill(dtd);
                    if (dtd.Rows.Count > 0)
                    {
                        //labelControl2.Text = "\r\nKết Nối Thành công !";
                        //labelControl2.Text = "\r\nBắt đầu chuyển dữ liệu hợp đồng ... ";

                        da = new SqlDataAdapter("select * from tblChuyenDL where isPublic = 1", connN);
                        DataTable dt = new DataTable();
                        da.Fill(dt);
                        foreach (DataRow row in dt.Rows)
                        {
                            cmd = new SqlCommand("Select count(*) from Hopdong Where isPublic=1 and Ma_DT=@madt", connS);
                            cmd.Parameters.AddWithValue("madt", row["Ma_HD"]);
                            openConn(connS);
                            if (cmd.ExecuteScalar().ToString() != "0")
                            {
                                cmd = new SqlCommand("Update Hopdong set Ma_DaiLy=@madaily , Ma_DMCanBo=@macanbo where Ma_DT=" + row["Ma_HD"].ToString(), connS);
                                cmd.Parameters.AddWithValue("@madaily", row["Ma_DaiLyMoi"]);
                                cmd.Parameters.AddWithValue("@macanbo", row["Ma_CanBoMoi"]);
                                cmd.ExecuteNonQuery();

                                da = new SqlDataAdapter("Select * from DoanhThu Where Ma_HopDong=@mahopdong", connS);
                                da.SelectCommand.Parameters.AddWithValue("@mahopdong", row["Ma_HD"]);
                                DataTable dt2 = new DataTable();
                                da.Fill(dt2);
                                //if (dt2.Rows.Count > 0)
                                //{// sua cho nay
                                cmd = new SqlCommand("INSERT INTO DOANHTHU(Ma_HopDong, Ma_DaiLy, Ma_DMCanBo) VALUES     (@mahopdong,@madaily,@macanbo)", connS);
                                cmd.Parameters.AddWithValue("@madaily", row["Ma_DaiLyMoi"]);
                                cmd.Parameters.AddWithValue("@macanbo", row["Ma_CanBoMoi"]);
                                cmd.Parameters.AddWithValue("@mahopdong", row["Ma_HD"]);
                                cmd.ExecuteNonQuery();
                                //}
                            }
                        }

                        // Truyen nhat ky dai ly
                        da = new SqlDataAdapter("Select * from NhatKyChuyenDL", connN);
                        dtNK = new DataTable();
                        da.Fill(dtNK);
                        foreach (DataRow row in dtNK.Rows)
                        {
                            SqlDataAdapter dankC = new SqlDataAdapter("Select * from NhatKyChuyenDL where ID_Update=@idupdate", connS);
                            dankC.SelectCommand.Parameters.AddWithValue("@idupdate", row["ID_Update"]);
                            DataTable dtnkc = new DataTable();
                            dankC.Fill(dtnkc);
                            if (dtnkc.Rows.Count <= 0)
                            {
                                // insert nhat ky chuyen dai ly
                                SqlCommand cmdNK = new SqlCommand(@"Insert into NhatKyChuyenDL(Ngay_Chuyen,Ma_DLCu,Ma_DLMoi,Ten_DL,Ma_CBCu,Ma_CBMoi,ID_Update,Ngay_HD) values(
                                                                    @Ngay_Chuyen,@Ma_DLCu,@Ma_DLMoi,@Ten_DL,@Ma_CBCu,@Ma_CBMoi,@ID_Update,@Ngay_HD)", connS);
                                cmdNK.Parameters.AddWithValue("@Ngay_Chuyen", row["Ngay_Chuyen"]);
                                cmdNK.Parameters.AddWithValue("@Ma_DLCu", row["Ma_DLCu"]);
                                cmdNK.Parameters.AddWithValue("@Ma_DLMoi", row["Ma_DLMoi"]);
                                cmdNK.Parameters.AddWithValue("@Ten_DL", row["Ten_DL"]);
                                cmdNK.Parameters.AddWithValue("@Ma_CBCu", row["Ma_CBCu"]);
                                cmdNK.Parameters.AddWithValue("@Ma_CBMoi", row["Ma_CBMoi"]);
                                cmdNK.Parameters.AddWithValue("@ID_Update", row["ID_Update"]);
                                cmdNK.Parameters.AddWithValue("@Ngay_HD", row["Ngay_HD"]);
                                cmdNK.ExecuteNonQuery();
                            }
                        }


                        //   clsCommon.thongBao("Chuyển thành công", 1);
                        this.Close();
                    }
                    else
                    {
                        //labelControl2.Text = "Không thể kết nối tới máy chủ!";
                    }
                }
            }
        }
        #endregion ================================================================================


        #region gridView ==========================================================================
        private void gvHopDong_DataSourceChanged(object sender, EventArgs e)
        {
            lblSoLuong.Text = "Số lượng: " + gvHopDong.RowCount.ToString();

            if (gvHopDong.RowCount == 0)
            {
                sbtnXoa.Enabled = false;
                sbtnTLyHD.Enabled = false;
                //sbtnIn.Enabled = false;
                sbtnLoc.Enabled = false;
                chkKhoiPhuc.Enabled = cbtnSua.Checked;
                sbtnKhoiPhuc.Enabled = false;
            }
            else
            {
                gvHopDong.ClearColumnErrors();
                if (cbtnSua.Checked)
                {
                    sbtnXoa.Enabled = true;
                    sbtnTLyHD.Enabled = true;
                }

                sbtnKhoiPhuc.Enabled = chkKhoiPhuc.Checked;
                //sbtnIn.Enabled = !chkKhoiPhuc.Checked;
                sbtnLoc.Enabled = true;
            }

            //Đoạn này xử lý sáng/mờ nút thêm
            if (MaDV == '%' || DMCanBoID==-1)
                sbtnThem.Enabled = false;
            else
            {
                if (cbtnSua.Checked)
                {
                    DataRow dr = gvHopDong.GetDataRow(GridControl.NewItemRowHandle);
                    if (dr == null) //Nếu dr == null tức là gvDonVi không có newrecord, ngược lại là có
                        sbtnThem.Enabled = !chkKhoiPhuc.Checked;
                    else sbtnThem.Enabled = false;
                }
            }
        }

        private void gvHopDong_ColumnFilterChanged(object sender, EventArgs e)
        {
            lblSoLuong.Text = "Số lượng: " + gvHopDong.RowCount.ToString();
        }

        DateTime dNgayTL;
        private void gvHopDong_ValidatingEditor(object sender, DevExpress.XtraEditors.Controls.BaseContainerValidateEditorEventArgs e)
        {
            if (gvHopDong.FocusedRowHandle != GridControl.NewItemRowHandle 
                && gvHopDong.FocusedRowHandle != GridControl.AutoFilterRowHandle)
            {
                if ((bool)gvHopDong.GetFocusedRowCellValue(gcolThanhLy) == true)
                    dNgayTL = (DateTime)gvHopDong.GetFocusedRowCellValue(gcolNgayTL);
                else dNgayTL = new DateTime();
            }
        }

        private void gvHopDong_InvalidValueException(object sender, DevExpress.XtraEditors.Controls.InvalidValueExceptionEventArgs e)
        {
            e.ErrorText = "Giá trị nhập vào không hợp lệ. Vui lòng nhập lại.";
        }

        private void gvHopDong_InvalidRowException(object sender, DevExpress.XtraGrid.Views.Base.InvalidRowExceptionEventArgs e)
        {
            this.Text = this.Text.Replace("*", "");
            this.Text += "*";

            gvHopDong.Appearance.FocusedRow.BackColor = frmMain.InvalidExceptionColor;
            frmMain.sEdittingFormName = frmMain.sEdittingFormName.Replace(this.Name, "");
            frmMain.sEdittingFormName += this.Name;

            e.ExceptionMode = DevExpress.XtraEditors.Controls.ExceptionMode.NoAction;
        }

        private void gvHopDong_ValidateRow(object sender, DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e)
        {
            gvHopDong.ClearColumnErrors();

            DataRow dr = gvHopDong.GetDataRow(e.RowHandle);
            if (dr != null)
            {
                e.Valid = RecordIsOK(dr);

                if (e.Valid) // Nếu dữ liệu nhập vào hợp lệ thì thực hiện lưu
                {
                    clsHopDong cls = new clsHopDong();
                    cls.OnAction += new clsHopDong.OnActionHandler(cls_OnAction);
                    cls.OnError += new clsHopDong.OnErrorHandler(cls_OnError);

                    if (e.RowHandle == GridControl.NewItemRowHandle)
                    {
                        cls.Insert(dr);
                        enableControlForAddNew(true);
                        lblSoLuong.Text = "Số lượng: " + gvHopDong.RowCount.ToString();
                    }
                    else cls.Update(dr);

                    loadData();
                    gvHopDong.Appearance.FocusedRow.BackColor = defaultColor;
                    this.Text = this.Text.Replace("*", "");
                    frmMain.sEdittingFormName = frmMain.sEdittingFormName.Replace(this.Name, "");
                }
            }
        }
        #endregion ================================================================================


        #region SUB AND FUNCTION ==================================================================
        private void rpt_OnLoadComplete()
        {
            SplashScreenManager.CloseForm();
        }
        
        private bool RecordIsOK(DataRow dr)
        {
            bool ok = true;

            //HÀM NÀY KIỂM TRA DỮ LIỆU NHẬP VÀO KHI THÊM MỚI HAY KHI SỬA MẨU TIN
            string msg = "";

            //KIỂM TRA MÃ HỢP ĐỒNG =============================================================
            Regex regexMaHD = new Regex(@"^(\d){4,6}$");    //=>mô tả một chuỗi gồm 4 - 6 ký số
            string mahd = dr["Ma_DT"].ToString().Trim().ToUpper();
            if (mahd == "")     //Kiểm tra rỗng
            {
                ok = false;
                msg = "MÃ HỢP ĐỒNG không được để trống";
                gvHopDong.SetColumnError(gcolMaHD, msg);
            }
            else if (!regexMaHD.IsMatch(mahd))  //Kiểm tra định dạng
            {
                ok = false;
                msg = "MÃ HỢP ĐỒNG phải gồm từ 4 đến 6 chữ số";
                gvHopDong.SetColumnError(gcolMaHD, msg);
            }
            else    //kiểm tra trùng
            {
                if (gvHopDong.FocusedRowHandle == GridControl.NewItemRowHandle)   //check for addnew
                {
                    
                    if (clsHopDong.checkMaHD(mahd) == false)
                    {
                        ok = false;
                        msg = "MÃ HỢP ĐỒNG bị trùng. Vui lòng kiểm tra lại";
                        gvHopDong.SetColumnError(gcolMaHD, msg);
                    }
                }
                else    //check for edit
                {
                    if (clsHopDong.checkMaHD(mahd, (int)dr["ID"]) == false)
                    {
                        ok = false;
                        msg = "MÃ HỢP ĐỒNG bị trùng. Vui lòng kiểm tra lại";
                        gvHopDong.SetColumnError(gcolMaHD, msg);
                    }
                }

            }

            //KIỂM TRA MÃ ĐẠI LÝ =============================================================
            string madl = dr["Ma_DaiLy"].ToString().Trim();
            Regex regexMaDL = new Regex(@"^(\d)(\d|[A-Z])(\d){2,4}$"); //Bắt đầu bằng một ký số + một ký tự hoặc ký số + hai đến 4 ký số
            if (madl == "")    //Kiểm tra rỗng
            {
                ok = false;
                msg = "MÃ ĐẠI LÝ không được để trống.";
                gvHopDong.SetColumnError(gcolMaDL, msg);
            }
            else if (!regexMaDL.IsMatch(madl))  //Kiểm tra định dạng
            {
                ok = false;
                msg = "MÃ ĐẠI LÝ phải bắt đầu bằng mã cán bộ tương ứng + 2 đến 4 chữ số";
                gvHopDong.SetColumnError(gcolMaDL, msg);
            }
            else if (gvHopDong.FocusedRowHandle == GridControl.NewItemRowHandle) //chỉ kiểm tra khi thêm mới
            {
                if (madl.Substring(0, 2) != ucCanBo1.lueCanBo.GetColumnValue("Ma_DT").ToString().Trim()) //Kiểm tra xem mã đại lý có bắt đầu bằng mã cán bộ hay không
                {
                    ok = false;
                    msg = "MÃ ĐẠI LÝ phải bắt đầu bằng mã cán bộ tương ứng";
                    gvHopDong.SetColumnError(gcolMaDL, msg);
                }
                else if (clsHopDong.checkMaDL(madl) == 1)
                {
                    ok = false;
                    msg = "MÃ ĐẠI LÝ bị trùng với một đại lý đang hoạt động. Vui lòng chọn mã khác";
                    gvHopDong.SetColumnError(gcolMaDL, msg);
                }
            }
            else    //check for edit
            {
                int result = clsHopDong.checkMaDL(madl, (int)dr["ID"], dNgayTL);

                if (result == 1) //Nếu là đại lý đang hoạt động và trùng mã với đại lý đang hoạt động khác
                {
                    ok = false;
                    msg = "MÃ ĐẠI LÝ bị trùng với một đại lý đang hoạt động. Vui lòng chọn mã khác";
                    gvHopDong.SetColumnError(gcolMaDL, msg);
                }
                else if (result == 5) //Nếu là đại lý thanh lý và trùng với mã với đại lý thanh lý khác
                {
                    ok = false;
                    msg = "MÃ ĐẠI LÝ bị trùng với một đại lý đã thanh lý khác. Vui lòng chọn mã khác";
                    gvHopDong.SetColumnError(gcolMaDL, msg);
                }
            }

            //KIỂM TRA SỐ CHỨNG MINH THƯ =========================================================
            if (dr["CMT"].ToString().Trim() != "")
            {
                Regex regexCMT = new Regex(@"^(\d){9,20}$");    //Mô tả một chuỗi chỉ có 9 ký tự số
                if (!regexCMT.IsMatch(dr["CMT"].ToString().Trim()))
                {
                    ok = false;
                    msg = "Số CHỨNG MINH THƯ không hợp lệ. Vui lòng nhập lại";
                    gvHopDong.SetColumnError(gcolCMT, msg);
                }
                else if (gvHopDong.FocusedRowHandle == GridControl.NewItemRowHandle)   // kiểm tra trùng (check for addnew)
                {
                    if (clsHopDong.checkCMT(dr["CMT"].ToString().Trim()) == false)
                    {
                        ok = false;
                        msg = "Số CHỨNG MINH THƯ bị trùng. Vui lòng kiểm tra lại";
                        gvHopDong.SetColumnError(gcolCMT, msg);
                    }
                }
                else    // kiểm tra trùng (check for edit)
                {
                    if (clsHopDong.checkCMT(dr["CMT"].ToString().Trim(), (int)dr["ID"]) == false)
                    {
                        ok = false;
                        msg = "Số CHỨNG MINH THƯ bị trùng. Vui lòng kiểm tra lại";
                        gvHopDong.SetColumnError(gcolCMT, msg);
                    }
                }
            }

            //KIỂM TRA TÌNH TRẠNG =============================================================
            if (dr["Ma_DMTinhTrang"].ToString().Trim() == "")
            {
                ok = false;
                msg = "TÌNH TRẠNG không được để trống.";
                gvHopDong.SetColumnError(gcolTinhTrang, msg);
            }

            //KIỂM TRA LOẠI HỢP ĐỒNG ============================================================
            if (dr["Ma_DMLoaiHD"].ToString().Trim() == "")
            {
                ok = false;
                msg = "LOẠI HỢP ĐỒNG không được để trống";
                gvHopDong.SetColumnError(gcolLoaiHD, msg);
            }

            return ok;
        }

        private void enableControlForAddNew(bool enabled)
        {
            if (enabled) sbtnThem.Tag = "";
            else sbtnThem.Tag = "AddNew";

            if (!BienTc.isMayChu()) sbtnXoa.Enabled = false;
            else if (gvHopDong.RowCount == 0)
            {
                sbtnXoa.Enabled = false;
                sbtnLoc.Enabled = false;
                //sbtnIn.Enabled = false;
            }
            else
            {
                sbtnXoa.Enabled = enabled;
                sbtnLoc.Enabled = enabled;
                //sbtnIn.Enabled = enabled;
            }

            sbtnThem.Enabled = enabled;
            chkKhoiPhuc.Enabled = enabled;

            if (BienTc.isThanhPho || BienTc.isQuanHuyen || !clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.B_InHopDong))
                sbtnIn.Enabled = false;
            else sbtnIn.Enabled = enabled;

            if (BienTc.isThanhPho || BienTc.isQuanHuyen || !clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.B_ThanhLyHopDong))
                sbtnTLyHD.Enabled = false;
            else sbtnTLyHD.Enabled = enabled;

            if (BienTc.isThanhPho || BienTc.isQuanHuyen || !clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.B_ChuyenDaiLy))
                sbtnChuyenDL.Enabled = false;
            else sbtnChuyenDL.Enabled = enabled;
        }

        private void loadData()
        {
            gcHopDong.DataSource = hd.loadData(MaDV, DMCanBoID, !chkKhoiPhuc.Checked, rgThanhly.SelectedIndex);
        }

        private void load_lueDonVi()
        {
            ucDonVi1.lueDonVi.Properties.DataSource = clsCommon.load_lueDonVi();

            if (BienTc.isQuanHuyen || BienTc.isThanhPho || !clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.L_DonVi))
            {
                ucDonVi1.lueDonVi.ItemIndex = ucDonVi1.lueDonVi.Properties.GetDataSourceRowIndex("Ma_DT", BienTc.ma_huyen == "" ? "TC" : BienTc.ma_huyen);
                if (BienTc.isQuanHuyen || BienTc.isThanhPho) ucDonVi1.lueDonVi.Properties.ReadOnly = true;
            }
            else ucDonVi1.lueDonVi.ItemIndex = 0;
        }

        private void lueDonVi_EditValueChanged(object sender, EventArgs e)
        {
            ucCanBo1.lueCanBo.Enabled = !(ucDonVi1.lueDonVi.ItemIndex == 0);
            string madv = ucDonVi1.lueDonVi.GetColumnValue("Ma_DT").ToString().Trim();
            MaDV = madv == "TC" ? '%' : Convert.ToChar(madv);
            TenDV = ucDonVi1.lueDonVi.GetColumnValue("Ten_DT").ToString().Trim();
            loadLueCanBo();
            if (ucCanBo1.lueCanBo.ItemIndex == 0) lueCanBo_EditValueChanged(null, null);
            else ucCanBo1.lueCanBo.ItemIndex = 0;
        }

        private void loadLueCanBo()
        {
            ucCanBo1.lueCanBo.Properties.DataSource = clsCommon.load_lueCanBo(MaDV);
        }

        private void lueCanBo_EditValueChanged(object sender, EventArgs e)
        {
            DMCanBoID = Convert.ToInt32(ucCanBo1.lueCanBo.GetColumnValue("ID").ToString().Trim());
            TenCB = ucCanBo1.lueCanBo.GetColumnValue("Ten_DT").ToString().Trim();

            if (gvHopDong.FocusedRowHandle == GridControl.NewItemRowHandle)
            {
                if (MaDV != '%' && DMCanBoID != -1)
                {
                    gvHopDong.SetRowCellValue(GridControl.NewItemRowHandle, "Ma_DT", hd.generateMaHD(MaDV));
                    gvHopDong.SetRowCellValue(GridControl.NewItemRowHandle, "DMCanBoID", DMCanBoID);
                }
                else loadData();
            }
            else loadData();
        }

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == Keys.Escape)
            {
                gvHopDong.CancelUpdateCurrentRow();
                enableControlForAddNew(true);

                gvHopDong.Appearance.FocusedRow.BackColor = defaultColor;
                this.Text = this.Text.Replace("*", "");
                frmMain.sEdittingFormName = frmMain.sEdittingFormName.Replace(this.Name, "");
            }

            return base.ProcessCmdKey(ref msg, keyData);
        }

        private void closeConn(SqlConnection conn)
        {
            if (conn.State == ConnectionState.Open)
            {
                conn.Close();
            }
        }

        private void openConn(SqlConnection conn)
        {
            if (conn.State == ConnectionState.Closed)
            {
                conn.Open();
            }
        }

        #region cls event --------------------------------------------
        private void cls_OnAction(SqlException e)
        {
            if (e.Message.Contains("The DELETE statement conflicted with the REFERENCE constraint"))
                XtraMessageBox.Show("Chưa thể xóa cán bộ này, vì còn có dữ liệu liên quan", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            else cls_OnError(e);
        }

        private void cls_OnError(Exception e)
        {
            frmMain.sEdittingFormName = frmMain.sEdittingFormName.Replace(this.Name, "");
            XtraMessageBox.Show("Một lỗi chưa được xử lý đã xảy ra. Chi tiết lỗi: \n" + e.Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
            this.Close();
        }
        #endregion ---------------------------------------------------------
        #endregion ================================================================================
    }
}